Consensus is a fundamental problem for distributed systems, including but not limited to, cloud computing environments. Because consensus protocols play a key role in reliable computing, there is significant interest in optimizing their performance. Consensus entails getting a group of participants (i.e., computing nodes in the environment) to reliably agree on some value used for computation (e.g., the next valid application state). Several protocols have been proposed to solve the consensus problem which form a foundation for building fault-tolerant systems, including the core infrastructure of data centers. For example, consensus protocols are the basis for state machine replication, which is used to implement key services, such as software-based services that maintain long-lived, critical state (such as configuration information) and to synchronize distributed components (e.g., OpenReplica), software-based services that implement object storage on a single distributed computer cluster, and to provide interfaces for object, block, and file level storage (e.g., Ceph), and software services that synchronize accesses to shared resources (e.g., Chubby). Moreover, several important distributed problems can be reduced to consensus, such as atomic broadcast and atomic commit.